package com.ruoyi.common.exception.file;

import java.io.PrintStream;
import java.io.PrintWriter;

/**
 * 文件上传异常类
 *
 * @author ruoyi
 */
public class FileUploadException extends Exception {

    private static final long serialVersionUID = 1L;

    private final Throwable cause;

    /**
     * 默认构造函数，创建一个没有消息和原因的文件上传异常
     */
    public FileUploadException() {
        this(null, null);
    }

    /**
     * 创建一个带有指定详细消息的文件上传异常
     *
     * @param msg 异常的详细消息
     */
    public FileUploadException(final String msg) {
        this(msg, null);
    }

    /**
     * 创建一个带有指定详细消息和原因的文件上传异常
     *
     * @param msg 异常的详细消息
     * @param cause 异常的原因
     */
    public FileUploadException(String msg, Throwable cause) {
        super(msg);
        this.cause = cause;
    }

    /**
     * 将异常堆栈跟踪信息打印到指定的打印流中
     * 如果存在原因异常，则同时打印原因异常的堆栈跟踪信息
     *
     * @param stream 要打印到的打印流
     */
    @Override
    public void printStackTrace(PrintStream stream) {
        super.printStackTrace(stream);
        // 如果存在原因异常，则打印原因异常的堆栈跟踪信息
        if (cause != null) {
            stream.println("Caused by:");
            cause.printStackTrace(stream);
        }
    }

    /**
     * 将异常堆栈跟踪信息打印到指定的打印写入器中
     * 如果存在原因异常，则同时打印原因异常的堆栈跟踪信息
     *
     * @param writer 要打印到的打印写入器
     */
    @Override
    public void printStackTrace(PrintWriter writer) {
        super.printStackTrace(writer);
        // 如果存在原因异常，则打印原因异常的堆栈跟踪信息
        if (cause != null) {
            writer.println("Caused by:");
            cause.printStackTrace(writer);
        }
    }

    /**
     * 获取导致此异常的原因异常
     *
     * @return 导致此异常的原因异常，如果不存在则返回null
     */
    @Override
    public Throwable getCause() {
        return cause;
    }
}

